import { aiModelAvatar, customerAvatar } from "@/mock-data/mock-chat-view";
import { Client, type LLMService } from "@/models";
import { MODEL_CONFIGS } from '@/models/config'
import type { IMessage } from "@/types";
import dayjs from "dayjs";
import { defineStore } from "pinia";
import { ref } from "vue";
import { useChatHistoryStore } from "./history-store";
import { useChatModelStore } from "./model-store";
import { useChatStatusStore } from "./status-store";
import type { ChatRequest } from '@/models/types.ts'

// 创建聊天消息存储
export const useChatMessageStore = defineStore("chat-message", () => {
  // 依赖的其他存储
  const chatStatusStore = useChatStatusStore();   // 聊天状态存储
  const chatHistoryStore = useChatHistoryStore(); // 聊天历史存储
  const chatModelStore = useChatModelStore();     // 聊天模型存储

  // 响应式状态
  const messages = ref<IMessage[]>([]);          // 当前聊天消息列表
  const messageChangeCount = ref(0);             // 消息变化计数器（用于强制更新视图）
  let client: LLMService;                        // AI模型服务客户端实例

  // 用户提问方法
  function ask(question: string, answer?: string) {
    if (question === "") return;  // 空问题直接返回

    // 如果是首次提问，初始化聊天状态
    if (!messages.value.length) {
      chatStatusStore.startChat = true;       // 标记聊天开始
      chatStatusStore.newChatId();             // 生成新聊天ID
    }

    // 保存当前聊天记录到历史
    chatHistoryStore.addHistory(
        chatStatusStore.currentChatId,           // 当前聊天ID
        dayjs().format("YYYY-MM-DD HH:mm"),      // 当前时间
        messages.value,                          // 当前所有消息
        chatModelStore.currentModel              // 当前使用的模型
    );

    // 添加用户消息
    messages.value.push({
      from: "user",                            // 消息发送方（用户）
      content: question,                       // 消息内容
      avatarPosition: "side-right",            // 头像位置（右侧）
      avatarConfig: { ...customerAvatar },     // 用户头像配置
    });
    messageChangeCount.value++;                // 触发视图更新

    // 获取AI回答（answer参数用于模拟模式）
    getAIAnswer(answer ?? question);           // 使用模拟答案或原问题
  }

  // 获取AI回答的核心方法
  const getAIAnswer = (content: string) => {
    let messageContent = MODEL_CONFIGS.multi ? messages.value.map(item => {
      return {
        role: item.from,
        content: item.content,
      }
    }) : [{
      role: 'user',
      content: content,
    }];

    // 添加初始AI消息（占位）
    messages.value.push({
      from: "assistant",                        // 消息发送方（AI模型）
      content: "",                             // 初始内容为空
      avatarPosition: "side-left",             // 头像位置（左侧）
      avatarConfig: { ...aiModelAvatar },      // AI头像配置
      loading: true,                           // 标记为加载中
      complete: false,                         // 标记未完成
    });

    // 模拟模式处理
    if (MODEL_CONFIGS.enableMock) {
      /* 模拟流式数据返回效果 */
      setTimeout(async () => {
        messages.value.at(-1)!.loading = false;  // 停止加载动画

        // 逐字显示模拟效果
        for (let i = 0; i < content.length; ) {
          await new Promise((r) => setTimeout(r, 300 * Math.random())); // 随机延迟
          i += Math.floor(Math.random() * 10);  // 随机增加字符数
          messages.value[messages.value.length - 1].content = content.slice(0, i);
          messageChangeCount.value++;           // 触发视图更新
        }

        // 保存完整聊天记录到历史
        chatHistoryStore.addHistory(
            chatStatusStore.currentChatId,
            dayjs().format("YYYY-MM-DD HH:mm"),
            messages.value,
            chatModelStore.currentModel
        );
      }, 1000); // 延迟1秒开始模拟
    }
    // 真实API模式
    else {
      // 从本地存储获取认证令牌
      const authToken = localStorage.getItem('yiguo_token');

      // 未认证处理
      if (MODEL_CONFIGS.authentication && !authToken) {
        messages.value.at(-1)!.loading = false;
        messages.value[messages.value.length - 1].content = "请先登录系统";
        messages.value[messages.value.length - 1].error = true; // 标记错误状态
        return;
      }

      // 构建API请求参数
      const request: ChatRequest = {
        conversation_id: chatStatusStore.currentChatId,
        content: messageContent,  // 用户问题内容
        streamOptions: {
          onMessage: onMessageChange,   // 流式消息更新回调
          onComplete: onMessageComplete, // 流式完成回调
        },
      };

      // 自定义鉴权
      if (MODEL_CONFIGS.authentication) { // 根据自己的鉴权方法来
        request.headers = {
          Authorization: `Bearer ${authToken}`,
        }
        request.content = [messageContent.pop()]; // 本示例通过后端实现了数据存储和多轮对话
      }

      // 检查模型是否有效
      if (!chatModelStore.currentModel) return;

      // 初始化AI客户端
      client = new Client(
          chatModelStore.currentModel.clientKey,     // 客户端标识
          chatModelStore.currentModel.providerKey    // 服务商标识
      ).client;

      // 发送聊天请求
      client.chat(request)
          .then((res) => {
            // 非流式响应处理
            messages.value.at(-1)!.loading = false;
            messages.value[messages.value.length - 1].content = res;

            // 保存历史记录
            chatHistoryStore.addHistory(
                chatStatusStore.currentChatId,
                dayjs().format("YYYY-MM-DD HH:mm"),
                messages.value,
                chatModelStore.currentModel
            );
          })
          .catch((error) => {
            // 错误处理
            messages.value.at(-1)!.loading = false;
            messages.value[messages.value.length - 1].content = "请求失败，请重试";
            messages.value[messages.value.length - 1].error = true;
          });
    }
  };

  // 流式消息更新回调
  const onMessageChange = (content: string) => {
    const lastMsg = messages.value.at(-1);
    if (!lastMsg) return;

    lastMsg.loading = false;                // 停止加载动画
    lastMsg.content += content;              // 追加流式内容
    messageChangeCount.value++;              // 触发视图更新
  };

  // 流式传输完成回调
  const onMessageComplete = () => {
    const lastMsg = messages.value.at(-1);
    if (!lastMsg) return;

    lastMsg.loading = false;                 // 停止加载动画
    lastMsg.complete = true;                 // 标记完成状态

    // 保存完整聊天记录
    chatHistoryStore.addHistory(
        chatStatusStore.currentChatId,
        dayjs().format("YYYY-MM-DD HH:mm"),
        messages.value,
        chatModelStore.currentModel
    );
  };

  // 暴露状态和方法
  return { messages, messageChangeCount, ask };
});